#ifndef _VM_H_
#define _VM_H_

#include "memory.h"
#include "types.h"

// 页表类型定义
typedef uint64* pagetable_t;
typedef uint64 pte_t;

// 页表项标志位 (Sv39)
#define PTE_V (1L << 0) // 有效位
#define PTE_R (1L << 1) // 可读
#define PTE_W (1L << 2) // 可写
#define PTE_X (1L << 3) // 可执行
#define PTE_U (1L << 4) // 用户可访问
#define PTE_G (1L << 5) // 全局映射
#define PTE_A (1L << 6) // 已访问
#define PTE_D (1L << 7) // 已修改

// 页表操作宏
#define PA2PTE(pa) ((((uint64)pa) >> 12) << 10)
#define PTE2PA(pte) (((pte) >> 10) << 12)
#define PX(level, va) (((va) >> (12 + 9*(level))) & 0x1FF)
#define MAXVA (1L << (9 + 9 + 9 + 12 - 1))

// 函数声明
pagetable_t create_pagetable(void);
pte_t* walk(pagetable_t pagetable, uint64 va, int alloc);
int map_pages(pagetable_t pt, uint64 va, uint64 pa, uint64 size, int perm);
int map_page(pagetable_t pagetable, uint64 va, uint64 pa, int perm);
void kvminit(void);
void kvminithart(void);
void test_pagetable(void);
pte_t* walk_lookup(pagetable_t pt, uint64 va);
void free_pagetable(pagetable_t pt);
#endif // _VM_H_
